import { readFileSync, writeFileSync, existsSync } from 'fs';
import { join } from 'path';

/**
 * 自动注入 qiankun 生命周期到子应用 main.ts
 * @param {string} subAppDir 子应用目录（如 src/renderer/exports/coursecenter）
 */
export async function injectQiankun(subAppDir) {
  try {
    // 1. 定位子应用入口文件（main.ts 或 main.js）
    const entryFile = join(subAppDir, 'src/main.ts');
    if (!existsSync(entryFile)) {
      console.log(`ℹ️ 子应用 ${subAppDir} 未找到 src/main.ts，跳过注入`);
      return;
    }

    // 2. 读取文件内容，检查是否已注入
    let fileContent = readFileSync(entryFile, 'utf-8');
    if (fileContent.includes('__POWERED_BY_QIANKUN__')) {
      console.log(`✅ 子应用 ${subAppDir} 已注入 qiankun 逻辑，跳过`);
      return;
    }

    // 3. 提取原应用的核心配置（从 createApp 到 mount 前的所有逻辑）
    // 3.1 匹配 "const app = createApp(App);"
    const appCreateReg = /const\s+app\s*=\s*createApp\s*\(\s*App\s*\)\s*;/i;
    const appCreateMatch = fileContent.match(appCreateReg);
    if (!appCreateMatch) {
      console.log(`⚠️ 子应用 ${subAppDir} 未找到 createApp 逻辑，注入基础模板`);
      await injectBasicTemplate(entryFile, subAppDir);
      return;
    }

    // 3.2 提取从 createApp 到 mount 之间的所有配置代码
    const createAppEndIndex = appCreateMatch.index + appCreateMatch[0].length;
    const mountReg = /app\.mount\s*\(\s*'\#app'\s*\)\s*;/i;
    const mountMatch = fileContent.match(mountReg);
    if (!mountMatch) {
      console.log(`⚠️ 子应用 ${subAppDir} 未找到 mount 逻辑，注入基础模板`);
      await injectBasicTemplate(entryFile, subAppDir);
      return;
    }
    const mountStartIndex = mountMatch.index;

    // 核心配置代码（全局属性、组件注册、插件等）
    const coreConfigCode = fileContent
      .slice(createAppEndIndex, mountStartIndex)
      .trim(); // 去除首尾空白

    // 3.3 注释原有的 mount 语句（避免独立运行时冲突）
    const contentWithoutMount = fileContent.replace(
      mountReg,
      `// 被 qiankun 注入脚本注释：原独立挂载逻辑\n// ${mountMatch[0]}`
    );

    // 4. 生成 qiankun 生命周期代码（复用核心配置）
    const subAppName = subAppDir.split('/').pop() || '子应用';
    const qiankunCode = `
// --------------------- 自动注入的 qiankun 生命周期（开始）---------------------
let qiankunApp = null; // 用 qiankunApp 避免与原 app 变量冲突

// 初始化钩子
export async function bootstrap() {
  console.log('${subAppName} 子应用初始化');
}

// 挂载钩子（复用原应用所有配置）
export async function mount(props) {
  // 创建应用实例
  qiankunApp = createApp(App);

  // 复用原应用的核心配置（全局属性、组件、指令、插件等）
  ${coreConfigCode}

  // 挂载到主应用提供的容器
  qiankunApp.mount(props.container.querySelector('#app') || '#app');
}

// 卸载钩子
export async function unmount() {
  if (qiankunApp) {
    qiankunApp.unmount();
    qiankunApp = null; // 释放实例
  }
}

// 独立运行逻辑（qiankun 环境外）
if (!window.__POWERED_BY_QIANKUN__) {
  const app = createApp(App);
  ${coreConfigCode}
  app.mount('#app');
}
// --------------------- 自动注入的 qiankun 生命周期（结束）---------------------
`;

    // 5. 写入最终内容（原逻辑 + 注入代码）
    const newContent = `${contentWithoutMount.trim()}\n\n${qiankunCode}`;
    writeFileSync(entryFile, newContent, 'utf-8');
    console.log(`🎉 子应用 ${subAppDir} 注入成功（已复用所有全局配置和插件）`);

  } catch (err) {
    console.error(`❌ 子应用 ${subAppDir} 注入失败：${err.message}`);
  }
}

/**
 * 基础模板（当无法提取核心配置时降级使用）
 */
async function injectBasicTemplate(entryFile, subAppDir) {
  const subAppName = subAppDir.split('/').pop() || '子应用';
  const basicCode = `
// --------------------- 自动注入的 qiankun 生命周期（开始）---------------------
let qiankunApp = null;

export async function bootstrap() {
  console.log('${subAppName} 子应用初始化');
}

export async function mount(props) {
  qiankunApp = createApp(App);
  // 提示：请手动补充以下配置（参考原 main.ts）
  // 1. 全局属性挂载
  // 2. 组件注册（如 ElementPlusIconsVue）
  // 3. 指令注册（如 mathjax）
  // 4. 插件使用（router、pinia、videoPlay 等）
  qiankunApp.mount(props.container.querySelector('#app') || '#app');
}

export async function unmount() {
  if (qiankunApp) {
    qiankunApp.unmount();
    qiankunApp = null;
  }
}

if (!window.__POWERED_BY_QIANKUN__) {
  const app = createApp(App);
  // 提示：请手动补充配置
  app.mount('#app');
}
// --------------------- 自动注入的 qiankun 生命周期（结束）---------------------
`;

  const fileContent = readFileSync(entryFile, 'utf-8');
  writeFileSync(entryFile, `${fileContent.trim()}\n\n${basicCode}`, 'utf-8');
}
